<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //函数声明，参数（形参，实参） （arguments),返回值return
    //函数表达式，匿名函数，立即执行函数
    //回调函数，递归函数
    //函数可以作为其他函数的返回值进行返回（返回的函数要进行调用，如果不调用返回的将是一个函数声明的整个内容）
    function fn1(a,b){
        console.log('fn1函数调用');
        return a+b;
    }
    let fn2 = function(f){
        console.log('fn2函数调用');
        return f;
    }
    console.log(fn2(fn1(3,2)));
    console.log(fn1(1,2));

//作用域：变量的作用范围
/*
js的运行分两个部分：
1.解析（编译）：语法检查，声明变量和函数
2.执行：对变量进行赋值，按照执行顺序进行执行
var和let的区别：
1.var 和 let 声明变量：var可以先使用在声明，let不允许。var有声明提升；let声明提升后执行时会出现暂时性死区，因此会报错
2.var在同一个作用域内声明的变量名可以相同，而let不允许
3.var和let都全局作用域和局部作用域（函数作用域），在let中增加了一个块作用域
推荐使用let（ES6),使我们的代码更严谨
*/
//console.log(num1);
console.log(num2);
let num1;//报错
var num2 =10;//undefined 未定义
var num2 = 'hello';
console.log(num2);
console.log('...........');
//全局作用域：全局变量
let a=1;
var b=2;
function myf(){
    //局部作用域（函数作用域）：局部变量
    let c=3;
    var d=4;
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
}
myf();
    console.log(a);
    console.log(b);
    //console.log(c);//报错
   // console.log(d);//报错
   console.log('..........块作用域.......');
//在let中增加了一个块作用域{}
for(let i=0;i<3;i++){
console.log('i:'+i);
}
//console.log(i); //报错：离开块作用域

for(var j=0;j<3;j++){
    console.log('j:'+j);

}
console.log(j);
</script>
</html>